Gatsby is a static web site framework that’s based on React.
We can use it to create static websites from external data sources and more.
In this article, we’ll look at how to create a site with Gatsby.
Markdown Data
We can get data from Markdown files and use them as a data source.
To do this, we install the gatsby-transformer-remark and gatsby-source-fulesystem plugins to get the Markdown files from a given folder.
We install gatsby-transformer-remark by running:
npm install gatsby-transformer-remark
And we install gatsby-source-filesystem by running:
npm install gatsby-source-filesystem
Then we write:
gatsby-config.js
/**
* Configure your Gatsby site with this file.
*
* See: https://www.gatsbyjs.com/docs/gatsby-config/
*/
module.exports = {
/* Your site config here */
plugins: [
`gatsby-transformer-remark`,
{
resolve: `gatsby-source-filesystem`,
options: {
name: `content`,
path: `${__dirname}/src/content`,
},
},
]
}
src/content/hello-world.md
---
title: Hello World
date: 2020-07-10
path: /hello-world
---
hello world
We get the Markdown files from the src/content folder.
The top part is the front matter, which we’ll use to create our page.
And when we run gatsby develop and go to http://localhost:8000/__graphql, we can query the Markdown files by writing:
{
allMarkdownRemark {
edges {
node {
frontmatter {
path
}
}
}
}
}
Then we get:
{
"data": {
"allMarkdownRemark": {
"edges": [
{
"node": {
"frontmatter": {
"path": "/hello-world"
}
}
}
]
}
},
"extensions": {}
}
from the response.
Now we need to create the page from the Markdown file.
To do this, we write:
gatsby-node.js
const path = require(`path`)
exports.createPages = async ({ actions, graphql }) => {
const { createPage } = actions
const result = await graphql(`
{
allMarkdownRemark {
edges {
node {
frontmatter {
path
}
}
}
}
}
`)
if (result.errors) {
console.error(result.errors)
}
result.data.allMarkdownRemark.edges.forEach(({ node }) => {
createPage({
path: node.frontmatter.path,
component: path.resolve(`src/templates/post.js`),
})
})
}
src/templates/post.js
import React from "react"
import { graphql } from "gatsby"
export default function Template({ data }) {
const { markdownRemark } = data
const { frontmatter, html } = markdownRemark
return (
<div className="blog-post">
<h1>{frontmatter.title}</h1>
<h2>{frontmatter.date}</h2>
<div
className="blog-post-content"
dangerouslySetInnerHTML={{ __html: html }}
/>
</div>
)
}
export const pageQuery = graphql`
query($path: String!) {
markdownRemark(frontmatter: { path: { eq: $path } }) {
html
frontmatter {
date(formatString: "MMMM DD, YYYY")
path
title
}
}
}
`
In gatsby-node.js , we make the same query we made in GraphiQL.
And then we get the response and call createPage to create the page with the path to the file as defined in the Markdown’s front matter.
And the component has the template to render the front matter and content.
In post.js , we get the data from the data prop.
We get the title and date properties from the frontMatter object to get the front matter data and display them.
Then the content is in the markdownRemark.html property.
Now when we go to http://localhost:8000/hello-world, we see:
Hello World
July 10, 2020
hello world
displayed.
Conclusion
We can render data from Markdown in our Gatsby static site.